home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 590 / 590.xpi / chrome / ipv6ident.jar / content / ipv6ident.js < prev    next >
Text File  |  2009-04-11  |  21KB  |  702 lines

  1. /*
  2.     ShowIP Firefox Extension
  3.     Copyright (C) 2007 Jan Dittmer <jdi@l4x.org>
  4.  
  5.     This program is free software; you can redistribute it and/or modify
  6.     it under the terms of the GNU General Public License as published by
  7.     the Free Software Foundation; either version 2 of the License, or
  8.     (at your option) any later version.
  9.  
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.  
  15.     You should have received a copy of the GNU General Public License
  16.     along with this program; if not, write to the Free Software
  17.     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  18. */
  19. const IPV6_NOTIFY_STATE_DOCUMENT =
  20.         Components.interfaces.nsIWebProgress.NOTIFY_STATE_DOCUMENT;
  21.     const IPV6_NOTIFY_LOCATION =
  22.         Components.interfaces.nsIWebProgress.NOTIFY_LOCATION;
  23.     const IPV6_STATE_IS_DOCUMENT =
  24.         Components.interfaces.nsIWebProgressListener.STATE_IS_DOCUMENT;
  25.     const IPV6_STATE_START =
  26.         Components.interfaces.nsIWebProgressListener.STATE_START;
  27.     //const IPV6_NOTIFY_ALL =
  28.     //    Components.interfaces.nsIWebProgressListener.NOTIFY_ALL;
  29.     const SHOWIP_RESOLVE_BYPASS_CACHE = 1;
  30.     const SHOWIP_RESOLVE_CANONICAL_NAME = 2;
  31.  
  32.  
  33. window.addEventListener("load", function() { showipExt.init(); }, false);
  34. //window.addEventListener("unload", function() { showipExt.destroy(); }, false);
  35. var showipExtRunOnce = 0;
  36. var showipExt = {
  37.     init: function()  {
  38.         if(showipExtRunOnce == 1) { return; }
  39.         showipExtRunOnce = 1;
  40.  
  41.         this.localip = null;
  42.         this.updating = false;
  43.         this.purgecache();
  44.         this.strings = document.getElementById("showip_strings");
  45.  
  46.         this.currenthost = null;
  47.         this.displayhost = 'not null ;-)';
  48.         this.currentstatus = 'none';
  49.         this.currentip = null;
  50.         this.panelText = 'init';
  51.  
  52.         // shamelessly taken from flagfox extension 
  53.         this.Listener = {
  54.         // this gets nsIWebProgress and nsIRequest
  55.         onLocationChange:function(aProgress,aRequest,aLocation) {
  56.             var host = 'none';
  57.             var scheme = 'none';
  58.             // try to prevent strange NS_ERRORS from StringBundle...
  59.             try {
  60.                 host = aLocation.host;
  61.                 scheme = aLocation.scheme;
  62.             } catch(e) {
  63.                 host = 'none';
  64.                 scheme = 'none';
  65.             }
  66.             if (!host || (host == '')) {
  67.                 host = 'none';
  68.             }
  69.             if ( (scheme == 'chrome') || (scheme == 'file') ) {
  70.                 host = 'none';
  71.             }
  72.             this.parent.updatestatus(host);
  73.         },
  74.         onStateChange:function(aProgress,aRequest,aFlag,aStatus) {},
  75.         onProgressChange:function(a,b,c,d,e,f){},
  76.         onStatusChange:function(a,b,c,d){},
  77.         onSecurityChange:function(a,b,c){},
  78.         onLinkIconAvailable:function(a){}
  79.         }; // this.Listener
  80.         this.Listener.parent = this;
  81.  
  82.         this.PrefObserver = {
  83.         register: function() {
  84.               var prefService = Components.classes["@mozilla.org/preferences-service;1"].
  85.                   getService(Components.interfaces.nsIPrefService);
  86.               this._branch = prefService.getBranch(""); // listen to all changes to also catch socks_remote_dns changes
  87.  
  88.               var pbi = this._branch.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
  89.               pbi.addObserver("", this, false);
  90.           },
  91.  
  92.         unregister: function()
  93.             {
  94.                 if(!this._branch) return;
  95.  
  96.                 var pbi = this._branch.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
  97.                 pbi.removeObserver("", this);
  98.             },
  99.  
  100.         observe: function(aSubject, aTopic, aData)
  101.          {
  102.              if(aTopic != "nsPref:changed") return;
  103.              if (!aData) return;
  104.              
  105.              if(aData.indexOf('ipv6ident')!=-1) {
  106.                  this.parent.prefs.Init();
  107.              }
  108.  
  109.              if( (aData.indexOf('network.proxy')!=-1)||
  110.                  (aData.indexOf('ipv6ident')!=-1)) {
  111.                 this.parent.updatesockspref(1);
  112.              }
  113.  
  114.          }
  115.         }; // this.prefObserver
  116.         this.PrefObserver.parent = this;
  117.  
  118.         // load preferences
  119.         this.prefs = showipExtPrefs;
  120.         this.prefs.Init();
  121.         // defer the notifier a bit, so that it shows after the main window
  122.         // to not confuse the users
  123.         window.setTimeout( function() { showipExt.prefs.checkblacklist(); }, 2000);
  124.  
  125.         this.ipv6enabled = !this.prefs.prefs.getBoolPref("network.dns.disableIPv6");
  126.         // needed for ff < 3
  127.         var appcontent = document.getElementById("appcontent");
  128.         appcontent.addEventListener("load", this.onPageLoad, true);
  129.  
  130.         if (gBrowser && gBrowser.tabContainer) {
  131.             // ff2+
  132.             gBrowser.tabContainer.addEventListener("TabSelect",
  133.                     function(event) {
  134.                         var browser = gBrowser.selectedTab.linkedBrowser;
  135.                         //alert("Tab select " + browser.currentURI.host);
  136.                         try {
  137.                         showipExt.updatestatus(browser.currentURI.host);
  138.                         } catch(e) { 
  139.                         showipExt.updatestatus('none');
  140.                         }
  141.  
  142.                     } ,false);
  143.         }
  144.  
  145.         window.getBrowser().addProgressListener(this.Listener,
  146.                 IPV6_NOTIFY_LOCATION | IPV6_NOTIFY_STATE_DOCUMENT);
  147.         this.PrefObserver.register();
  148.  
  149.         this.updatesockspref(0);
  150.     },
  151.  
  152. updatesockspref: function(updatestatus) {
  153.         var srdprefs = Components.classes["@mozilla.org/preferences-service;1"].
  154.                 getService(Components.interfaces.nsIPrefBranch);
  155.         try {
  156.             var sh = srdprefs.getCharPref("network.proxy.socks"); // string
  157.             var sp = srdprefs.getIntPref("network.proxy.socks_port");
  158.             var sv = srdprefs.getIntPref("network.proxy.socks_version"); // dns socks only supported for version 5
  159.             var srd = srdprefs.getBoolPref("network.proxy.socks_remote_dns");
  160.             var pt = srdprefs.getIntPref("network.proxy.type"); // == 1 for proxy
  161.             this.socks_remote_dns = sh && sp && sv && srd &&
  162.                     (sh != '') && (sp > 0) && (sv > 4) && (pt == 1) && (this.prefs.forcesocks == false);
  163.             //alert(this.prefs.forcesocks + ',' + this.socks_remote_dns + ',' + sh + ',' + sp + ',' + sv + ',' + pt + ',' + (this.prefs.forcesocks == false));
  164.         } catch(e) {
  165.             this.socks_remote_dns = false;
  166.         }
  167.         this.purgecache();
  168.         this.displayhost = '';
  169.         this.localip = null;
  170.         if (updatestatus)
  171.             this.updatestatus(this.currenthost);
  172. },
  173.  
  174. useproxy: function (url) {
  175.     // detect if the given url would use a proxy for dns resolution
  176.     var ios = Components.classes["@mozilla.org/network/io-service;1"]
  177.                                     .getService(Components.interfaces.nsIIOService);
  178.     var pps = Components.classes["@mozilla.org/network/protocol-proxy-service;1"]
  179.                                 .getService(Components.interfaces.nsIProtocolProxyService);
  180.     try {
  181.         var uri = ios.newURI(url, null, null);
  182.         var pi = pps.resolve(uri, 0);
  183.         // TRANSP... is only set in case of a SOCKS proxy (see nsProtocolProxyService.cpp#1329)
  184.         return (pi != null);//  && (pi.flags & pi.TRANSPARENT_PROXY_RESOLVES_HOST);
  185.     } catch (e) {
  186.         dump(e.description);
  187.         return false;
  188.     }
  189. },
  190.  
  191. purgecache: function () {
  192.     this.dnscache = new Array();
  193.     this.dnscache['none'] = new Array();
  194.     this.dnscache['exception'] = new Array();
  195.     this.dnscache['string_none'] = new Array();
  196.     this.dnscache['string_exception'] = new Array();
  197.  
  198. },
  199.     destroy: function()  {
  200.         this.PrefObserver.unregister();
  201.         window.getBrowser().removeProgressListener(this.Listener);
  202.     },
  203.  
  204.     // 'load' event handler, necessary??
  205.     onPageLoad: function(e) {
  206.         var doc = e.originalTarget;
  207.         if (doc && doc.location &&
  208.                 (
  209.                 (doc.location.protocol == 'http:') ||
  210.                 (doc.location.protocol == 'ftp:') ||
  211.                 0
  212.                 )
  213.                ) {
  214.             showipExt.updatestatus(doc.location.host);
  215.         } else {
  216.             showipExt.updatestatus("none");
  217.         }
  218.     },
  219.  
  220.     getdns: function() {
  221.         var cls = Components.classes['@mozilla.org/network/dns-service;1'];
  222.         var iface = Components.interfaces.nsIDNSService;
  223.         var dns = cls.getService(iface);
  224.         return dns;
  225.     },
  226.  
  227.     // setup ipv6_localip with all local ips
  228.     getLocalIp: function() {
  229.         if (this.socks_remote_dns)
  230.             return "Disabled due to SOCKS proxy";
  231.         if (this.localip)
  232.             return this.localip;
  233.         var a = new Array();
  234.         // doc.location is the Location object
  235.         try {
  236.             var dns = this.getdns();
  237.             var nsrecord = dns.resolve(dns.myHostName, true);
  238.             while (nsrecord && nsrecord.hasMore()) {
  239.                 a[a.length] = nsrecord.getNextAddrAsString();
  240.             }
  241.             this.localip = a.join(" | ");
  242.         } catch (e) {
  243.             this.localip = dns.myHostName + " not resolvable";
  244.         }
  245.         return this.localip;
  246.     },
  247.  
  248. // return the ip of host
  249. resolveIp: function(host) {
  250.     if (this.socks_remote_dns)
  251.         return new Array();
  252.     var asyncLookup = this.prefs.asyncresolve;
  253.     var dns = this.getdns();
  254.     try {
  255.         if (asyncLookup) {
  256.             var dnslistener = {
  257.             onLookupComplete: function(aRequest, aRecord, aStatus) {
  258.                   var ip = new Array();
  259.                   while(aRecord && aRecord.hasMore()) {
  260.                       ip.push(aRecord.getNextAddrAsString());
  261.                   }
  262.                   this.parent.updatestatus(this.host, ip);
  263.               }
  264.             };
  265.             var th;
  266.             if (Components.classes["@mozilla.org/event-queue-service;1"]) {
  267.                 const EQS = Components.classes["@mozilla.org/event-queue-service;1"].getService(Components.interfaces.nsIEventQueueService);
  268.                 th = EQS.getSpecialEventQueue(EQS.CURRENT_THREAD_EVENT_QUEUE);
  269.             } else {
  270.                 th = Components.classes["@mozilla.org/thread-manager;1"].getService().mainThread;
  271.  
  272.             }
  273.             dnslistener.parent = this;
  274.             dnslistener.host = host;
  275.             dns.asyncResolve(host, 0, dnslistener, th);
  276.             return ['pending'];
  277.         } else {
  278.             var ns = dns.resolve(host, true);
  279.             var ip = new Array();
  280.             while (ns && ns.hasMore()) {
  281.                 ip.push(ns.getNextAddrAsString());
  282.             }
  283.             return ip;
  284.         }
  285.     } catch(e) {
  286.         //alert("Resolve exception " + host);
  287.         return ['error'];
  288.     }
  289.  
  290.     return new Array();
  291.  
  292. },
  293.  
  294. // convert num to base 'radix'
  295. dec2radix: function(num, radix, pad) {
  296.     var a = [0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F'];
  297.     var s = '';
  298.     while(num > 0) {
  299.         s = a[num % radix] + s;
  300.         num = Math.floor(num / radix);
  301.     }
  302.     while((pad - s.length) > 0) {
  303.         s = '0' + s;
  304.     }
  305.     return s;
  306. },
  307.  
  308. // update the statusbar panel
  309. // @host string hostname to look up
  310. // @ips  array  ips corresponding to the host (when called from async resolver)
  311. updatestatus: function(host, ips) {
  312. //    alert("host: " + host);
  313.     if (!host)
  314.         return;
  315.     var cachekey = 'string_' + host;
  316.     var panel = document.getElementById("showip_status_text");
  317.     var cacheage = 1*this.prefs.cacheage; // -1: inf, 0: no cache, else time in seconds
  318.     var d = new Date();
  319.     var now = Math.ceil(d.getTime()/1000);
  320.     var cachetime = now;
  321.     var text = "";
  322.     var status = "";
  323.     //var winurl = getBrowser().window.top.currentURI.spec;
  324.     var winurl = null;
  325.     try {
  326.         var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  327.                            .getService(Components.interfaces.nsIWindowMediator);
  328.         var mainWindow = wm.getMostRecentWindow("navigator:browser");
  329.         winurl = mainWindow.getBrowser().currentURI.host;
  330.     } catch(e) {
  331.         // firefox 2.0 or no url, http is a guess...
  332.         winurl = 'http://' + host;
  333.     }
  334.  
  335.     if ((winurl != host) && ((host != 'none') || (winurl)))   {
  336.         //alert('Ignoring update for ' + host + ', visible url ' + winurl);
  337.         return;
  338.     }
  339.     this.currenthost = host;
  340.     if (host == this.displayhost) {
  341.         // optimize out about 4/5 of all calls...
  342.         return;
  343.     }
  344.  
  345.     if( (this.prefs.forcesocks == false) && (this.socks_remote_dns || this.useproxy(winurl))) {
  346.         panel.setAttribute("label", host);
  347.         panel.label = host;
  348.         panel.setAttribute("tooltiptext", this.strings.getFormattedString("socksdisabled",  []));
  349.         return;
  350.     }
  351.  
  352.     // cache handling
  353.     if (!ips && this.dnscache[cachekey] && (cacheage != 0)) {
  354.         var tmp = this.dnscache[cachekey];
  355.         //alert("Tmp " + tmp.join(","));
  356.         cachetime = tmp[0];
  357.         var expire = 1*cachetime + 1*cacheage;
  358.     //    alert("Expire " + host + " " + expire + " now " + now + " " + cacheage);
  359.         if ((expire > now) || (cacheage == -1)) {
  360.             ips = tmp.slice(1);
  361.         } else
  362.             ips = this.resolveIp(host);
  363.     } else if (!ips)
  364.         ips = this.resolveIp(host);
  365.  
  366.     // no result yet, async lookup
  367.     if (ips.length && (ips[0] == 'pending')) {
  368.         text = this.strings.getString("pending");
  369.         panel.setAttribute("label", text);
  370.         panel.label = text;
  371.         this.panelText = text;
  372.         return;
  373.     }
  374.  
  375.     if (ips.length && (ips[0] == 'error')) {
  376.         //text = this.strings.getString("pending");
  377.         panel.setAttribute("label", "dns error");
  378.         panel.label = text;
  379.         this.panelText = "dns error";
  380.         return;
  381.     }
  382.  
  383.     // cache value
  384.     if (ips && !this.dnscache[cachekey] && (cacheage != 0)) {
  385.         if (this.dnscache.length > 400)
  386.             this.dnscache.shift();
  387.         // save current time, and break references!
  388.         var x = now + ',' + ips.join(',');
  389.         this.dnscache[cachekey] = x.split(',');
  390.     }
  391.  
  392.     if (ips.length) {
  393.         var j = 0;
  394.         text = ips[j];
  395.         // if ipv6 is disabled try to find a ipv4 address
  396.         // for display
  397.         while (!this.ipv6enabled && (text.indexOf(':') != -1) &&
  398.                 ( j < ips.length) ) {
  399.             text = ips[j];
  400.             j++;
  401.         }
  402.         // if ipv6 is enabled try to find a ipv6 address
  403.         // for display
  404.         while (this.ipv6enabled && (text.indexOf('.') != -1) &&
  405.                 ( j < ips.length) ) {
  406.             text = ips[j];
  407.             j++;
  408.         }
  409.     } else
  410.         text = this.strings.getString("nopage");
  411.     // text is ip or host here
  412.     if (text.indexOf(":") != -1) {
  413.         // ipv6
  414.         status = "ipv6";
  415.     } else if (text.indexOf(".") != -1) {
  416.         // ipv4
  417.         status = "ipv4";
  418.         // 0: break; // decimal
  419.         if (this.prefs.ipv4style) {
  420.             var n = text.split('.');
  421.             var i;
  422.             for(i=0;i<4;i++) {
  423.                 n[i]=parseInt(n[i]);
  424.             }
  425.             switch(this.prefs.ipv4style) {
  426.             case 1:
  427.                 for(i=0;i<4;i++) {
  428.                     n[i] = this.dec2radix(n[i], 8, 4);
  429.                 }
  430.                 text = n.join('.');
  431.                 break; // octal
  432.             case 2:
  433.                 for(i=0;i<4;i++) {
  434.                     n[i] = '0x' + this.dec2radix(n[i], 16, 2);
  435.                 }
  436.                 text = n.join('.');
  437.                 break; // hex
  438.             case 3:
  439.                 text = (n[0]*16777216)+(n[1]*65536)+(n[2]*256)+n[3];
  440.                 break; // dword
  441.             }
  442.         }
  443.     } else {
  444.         // unknown
  445.         status = "unknown";
  446.     }
  447.  
  448.     this.currentip = ips.join(',');
  449.     if (ips.length > 1)
  450.         text += ' +' + (ips.length - 1);
  451. //    text += ' @' + cachetime;
  452.     this.currentstatus = status;
  453.  
  454.     panel.setAttribute("label", text);
  455.     panel.label = text;
  456.     panel.setAttribute("tooltiptext", this.strings.getFormattedString("localips",  [this.getLocalIp()]));
  457.     panel.setAttribute("style", "color:" + this.prefs.color[status]+";");
  458.     this.panelText = text;
  459.  
  460.     /*
  461.     var popup = document.getElementById("showip_ipmenu");
  462.     if (popup) {
  463.         // re-arm
  464.         popup.onpopupshowing = function() {showipExt.AddIPItems(this);};
  465.     }
  466.     */
  467.     this.displayhost = host;
  468.     return;
  469. },
  470.  
  471. showPopup: function(e,o) {
  472.     var popup = document.getElementById("showip_popup");
  473.  
  474.     //alert('click ' + e.button + ' panelText ' + this.panelText);
  475.     switch(e.button) {
  476.     case 0: //left
  477.         this._AddPopupItems("showip_popup","H",this.currenthost, 1);
  478.         break;
  479.     case 1: //middle?
  480.         this.openurl('http://dnstools.l4x.org/##',this.currenthost);
  481.         return;
  482.         break;
  483.     case 2: //right
  484.         if (this.socks_remote_dns) {
  485.             this._AddPopupItems("showip_popup","H",this.currenthost, 1);
  486.             break;
  487.         }
  488.         var ip = this.currentip;
  489.         var ips = ip.split(',');
  490.         if (ips.length == 1) {
  491.             if (ip.indexOf(":") == -1) {
  492.                 this._AddPopupItems("showip_popup","4",ip,1);
  493.             } else {
  494.                 this._AddPopupItems("showip_popup","6",ip,1);
  495.             }
  496.             break;
  497.         }
  498.  
  499.         // deletes all items
  500.         this._AddPopupItems("showip_popup","M","Multiple...",1);
  501.  
  502.         // TODO sort by real IP value
  503.         ips.sort();
  504.         // show one submenus for every IP
  505.         var i;
  506.         for(i = 0; i < ips.length; i++) {
  507.             var xip = ips[i];
  508.  
  509.             var menu = document.createElement("menu");
  510.             menu.setAttribute("label", xip);
  511.             popup.appendChild(menu);
  512.  
  513.             var mp = document.createElement("menupopup");
  514.             mp.id = "showip_ipmenu_" + xip;
  515.             // dummy function to prevent recursion
  516.             mp.onpopupshowing = function() {};
  517.             menu.appendChild(mp);
  518.  
  519.             if (xip.indexOf(":") == -1) {
  520.                 this._AddPopupItems("showip_ipmenu_" + xip, "4", xip, 0);
  521.             } else {
  522.                 this._AddPopupItems("showip_ipmenu_" + xip, "6", xip, 0);
  523.             }
  524.         }
  525.         break;
  526.     }
  527.     popup.showPopup(e.target,-1,-1,"popup","bottomleft","topleft");
  528. },
  529. // build popup menu
  530. // @ident 4, 6 or H
  531. // @hostname IP or Hostname
  532. _AddPopupItems: function(popupname, ident, hostname, header) {
  533.     var popup = document.getElementById(popupname);
  534.     var item;
  535.     if (!popup) {
  536.         return;
  537.     }
  538.     // top 3 items remain (currentip, seperator, copy to clipboard
  539.     if (popup.childNodes.length > 1)
  540.         for(var j=popup.childNodes.length - 1; j>=0; j--)
  541.             popup.removeChild(popup.childNodes.item(j));
  542.  
  543.     if (header) {
  544.         item = document.createElement("menuitem");
  545.         if (ident == 'H') {
  546.             item.setAttribute("label", this.strings.getFormattedString("hostmenutitle" , [hostname]));
  547.         } else {
  548.             item.setAttribute("label", this.strings.getFormattedString("ipmenutitle" , [hostname]));
  549.         }
  550.         popup.appendChild(item);
  551.  
  552.         item = document.createElement("menuseparator");
  553.         popup.appendChild(item);
  554.     }
  555.  
  556.     item = document.createElement("menuitem");
  557.     item.setAttribute("label", this.strings.getFormattedString("copytoclipboard",[]));
  558.     if (ident == 'M') {
  559.         item.setAttribute("oncommand", 'showipExt.copytoclip("'+this.currentip+'");');
  560.     } else {
  561.         item.setAttribute("oncommand", 'showipExt.copytoclip("'+hostname+'");');
  562.     }
  563.     popup.appendChild(item);
  564.  
  565.     var entries = this.prefs.menuurls.split("||");
  566.     for(var i = 0; i < entries.length; i++) {
  567.         var parts = entries[i].split("|");
  568.         if (parts.length != 3)
  569.             continue;
  570.         if (parts[0].indexOf(ident) == -1 )
  571.             continue;
  572.         item = document.createElement("menuitem");
  573.         item.setAttribute("label", parts[1]);
  574.         item.setAttribute("oncommand", "showipExt.openurl(\"" + parts[2] + "\",\"" + hostname + "\",\"" + ident + "\")");
  575.         popup.appendChild(item);
  576.     }
  577.  
  578.     /*
  579.     item = document.createElement("menuitem");
  580.     item.setAttribute("label", "socketping");
  581.     item.setAttribute("oncommand", "showipExt.socketping(\"" + hostname + "\")");
  582.     popup.appendChild(item);
  583.     */
  584. },
  585.  
  586. // openurl in newtab/hiddentab/same tab
  587. openurl: function(url, rep, ident) {
  588.  
  589.     // complete uri
  590.     url = url.replace(/###/, encodeURIComponent(getBrowser().currentURI.spec));
  591.     url = url.replace(/#U#/, encodeURIComponent(getBrowser().currentURI.spec));
  592.     // only domain/ip
  593.     url = url.replace(/##/, rep);
  594.     if (this.currentip) {
  595.         url = url.replace(/#I#/, this.currentip);
  596.     }
  597.     // extract domain name
  598.     if (this.currenthost) {
  599.         var dn = this.currenthost;
  600.         var x = dn.split(/\./);
  601.         if (x.length > 1) {
  602.             var tld = x[x.length - 1];
  603.             var sld = x[x.length - 2];
  604.             dn = sld + '.' + tld;
  605.             // handle co.uk etc.
  606.             if ((sld.length < 3) && (x.length > 2))
  607.                 dn = x[x.length - 3] + '.' + dn;
  608.         }
  609.         url = url.replace(/#D#/, dn);
  610.     }
  611.     if (url.indexOf('!') == 0) {
  612.         // call local program
  613.         // create an nsILocalFile for the executable
  614.         var file = Components.classes["@mozilla.org/file/local;1"]
  615.             .createInstance(Components.interfaces.nsILocalFile);
  616.         file.initWithPath(url.substr(1));
  617.  
  618.         // create an nsIProcess
  619.         var process = Components.classes["@mozilla.org/process/util;1"]
  620.             .createInstance(Components.interfaces.nsIProcess);
  621.         process.init(file);
  622.  
  623.         // Run the process.
  624.         // If first param is true, calling process will be blocked until
  625.         // called process terminates.
  626.         // Second and third params are used to pass command-line arguments
  627.         // to the process.
  628.         var args = [rep,encodeURIComponent(getBrowser().currentURI.spec)];
  629.         process.run(false, args, args.length);
  630.         return;
  631.     }
  632.     if (this.prefs.newtab) {
  633.         var tab = getBrowser().addTab(url);
  634.         if (!this.prefs.hiddentab)
  635.             getBrowser().selectedTab = tab;
  636.  
  637.     } else
  638.         getBrowser().loadURI(url);
  639. },
  640.  
  641. // copy first argument to clipboard
  642. copytoclip: function(host) {
  643.   const gClipboardHelper = Components.classes["@mozilla.org/widget/clipboardhelper;1"]
  644.       .getService(Components.interfaces.nsIClipboardHelper);
  645.         gClipboardHelper.copyString(host);
  646. },
  647.  
  648. socketping: function(host) {
  649.      var transportService =
  650.               Components.classes["@mozilla.org/network/socket-transport-service;1"]
  651.                      .getService(Components.interfaces.nsISocketTransportService);
  652.     var socket = transportService.createTransport(null,0,host,80, null);
  653.     this.TPEventSink = {
  654.      onTransportStatus: function( aTransport,aStatus,aProgress,aProgressMax) {
  655.                     alert("TP" + aStatus + " " + aProgress);
  656.                 },
  657.     QueryInterface : function(aIID) {
  658.          if (aIID.equals(Components.interfaces.nsISupports) ||
  659.                  aIID.equals(Components.interfaces.nsITransportEventSink))
  660.              return this;
  661.          throw Components.results.NS_NOINTERFACE;
  662.      }
  663.     }
  664.  
  665.     //socket.setEventSink(this.TPEventSink,null);
  666.     var ostream = socket.openOutputStream(0,0,0);
  667.     ostream.write("1",1);
  668.     ostream.close()
  669.     //alert(socket.getPeerAddr());
  670. },
  671.  
  672. httplistenerInit: function() {
  673.     this.HttpObserver = {
  674.     observe : function(aSubject, aTopic, aData) {
  675.           // Make sure it is our connection first.
  676.           if (aSubject == gChannel) {
  677.               var httpChannel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
  678.               if (aTopic == "http-on-modify-request") {
  679.                   // ...
  680.               } else if (aTopic == "http-on-examine-response") {
  681.                   // ...
  682.               }
  683.           }
  684.       },
  685.     QueryInterface : function(aIID) {
  686.          if (aIID.equals(Components.interfaces.nsISupports) ||
  687.                  aIID.equals(Components.interfaces.nsIObserver))
  688.              return this;
  689.          throw Components.results.NS_NOINTERFACE;
  690.      }
  691.     };
  692.      // get the observer service and register for the two coookie topics.
  693.       var observerService = Components.classes["@mozilla.org/observer-service;1"]
  694.               .getService(Components.interfaces.nsIObserverService);
  695.       observerService.addObserver(listener, "http-on-modify-request", false);
  696.       observerService.addObserver(listener, "http-on-examine-response", false);
  697. },
  698.  
  699. dummy: function() {
  700. } // without a comma
  701. }; // showipExt
  702.